#pragma once

#include "viml/liveness_analyzer.h"
#include <memory>
#include <unordered_map>

namespace viml {

// 前向声明
class Bytecode;

/**
 * 寄存器分配器
 * 使用图着色算法实现寄存器重分配
 */
class RegisterAllocator {
public:
    RegisterAllocator() = default;
    
    /**
     * 分配寄存器
     * @param bytecode 待优化的字节码
     * @param analyzer 活性分析结果
     * @return 是否分配成功
     */
    bool allocate(std::shared_ptr<Bytecode>& bytecode, const LivenessAnalyzer& analyzer);
    
    /**
     * 获取寄存器映射表
     * @return 虚拟寄存器到物理寄存器的映射
     */
    const std::unordered_map<uint32_t, uint32_t>& get_register_mapping() const {
        return register_mapping_;
    }
    
    /**
     * 获取重用次数
     * @return 寄存器重用的次数
     */
    size_t get_reuse_count() const {
        return reuse_count_;
    }
    
    /**
     * 获取使用的物理寄存器数量
     * @return 物理寄存器数
     */
    size_t get_physical_register_count() const {
        return physical_register_count_;
    }
    
    /**
     * 重置分配器状态
     */
    void reset();
    
private:
    // 分配算法
    void allocate_registers(const LivenessAnalyzer& analyzer);
    void rewrite_bytecode(std::shared_ptr<Bytecode>& bytecode);
    
    // 贪心着色算法
    uint32_t find_available_register(uint32_t virtual_reg, 
                                      const std::unordered_set<uint32_t>& conflicts,
                                      const LivenessAnalyzer& analyzer);
    
    // 数据成员
    std::unordered_map<uint32_t, uint32_t> register_mapping_;  // 虚拟寄存器 -> 物理寄存器
    size_t physical_register_count_ = 0;                       // 使用的物理寄存器数量
    size_t reuse_count_ = 0;                                   // 寄存器重用次数
};

} // namespace viml
